﻿using System;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
using csvmb.contracts;
using csvmb.contracts.datacontracts;
using csvmb.contracts.infrastructure;
using csvmb.gui.contracts;

namespace csvmb.gui
{
    public partial class Gui : Form, IEntryPoint, IGui
    {
        private const int Ausschnitthöhe = 17;

        public Gui() {
            InitializeComponent();
        }

        public void Run(string[] args) {
            ShowDialog();
        }

        private void btnOeffnen_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() ==  DialogResult.OK)
            {
                 Datei_Oeffnen(new Tuple<string, int>(ofd.FileName, Ausschnitthöhe));
            }
        }
        
        public event Action<Tuple<int, Richtung, long>> Blaettern;

        public event Action<Tuple<string, int>> Datei_Oeffnen;

        public void Zeige_ViewModel(ViewModel viewmodel)
        {
            lvDatensaetze.Clear();

            foreach (var spalte in viewmodel.Ausschnitt.Spaltennamen)
            {
                lvDatensaetze.Columns.Add(spalte);
            }
            
            foreach (var datensatz in viewmodel.Ausschnitt.Datensaetze)
            {
                 var item = new ListViewItem(datensatz.Spaltenwerte.ToArray());
                 lvDatensaetze.Items.Add(item);
            }

            btnAnfang.Enabled = viewmodel.Blättern_an_den_Anfang_erlaubt;
            btnZurueck.Enabled = viewmodel.Blättern_zurück_erlaubt;
            btnVor.Enabled = viewmodel.Blättern_weiter_erlaubt;
            btnEnde.Enabled = viewmodel.Blättern_an_das_Ende_erlaubt;
            lblAktuell.Text = viewmodel.Ausschnittsnummer.ToString();
            lblGesamt.Text = viewmodel.Ausschnittanzahl.ToString();

        }

        private void btnVor_Click(object sender, EventArgs e)
        {
            Blaetternclick(Richtung.Vor);
        }

        private void btnEnde_Click(object sender, EventArgs e)
        {
            Blaetternclick(Richtung.Ende);
        }

        private void btnZurueck_Click(object sender, EventArgs e)
        {
            Blaetternclick(Richtung.Zurueck);
        }

        private void btnAnfang_Click(object sender, EventArgs e)
        {
            Blaetternclick(Richtung.Anfang);
        }

        private void Blaetternclick(Richtung richtung)
        {
            int seiteAkutell = int.Parse(lblAktuell.Text);
            int seitenGesamt = int.Parse(lblGesamt.Text);

            Blaettern(new Tuple<int, Richtung, long>(seiteAkutell, richtung, seitenGesamt));
        }

    }
}